package com.edu.exam.entity.grading.audit;

import com.edu.exam.enums.grading.audit.AuditApprovalStatus;
import com.edu.exam.enums.grading.audit.AuditPermissionLevel;
import com.edu.exam.enums.grading.audit.AuditPermissionType;
import com.edu.exam.enums.grading.audit.PermissionScope;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩审核权限实体类
 *
 * <p>成绩审核权限实体用于管理审核系统的权限控制，包含
 * 用户权限、角色权限、访问控制、权限范围等。确保审核操作的安全性和合规性。</p>
 *
 * <p>所属模块：B-06 成绩管理模块</p>
 * <p>对应数据库表：grade_audit_permission</p>
 *
 * <p>核心功能：
 * - 权限管理：管理用户和角色的审核权限
 * - 访问控制：控制对审核数据和操作的访问
 * - 权限范围：定义权限的作用范围和限制
 * - 权限授权：管理权限的授予和撤销
 * - 权限审计：记录权限变更的审计信息</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeAuditPermission {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户ID
     *
     * <p>拥有权限的用户ID，为空表示角色权限。</p>
     */
    @Column(name = "user_id", length = 50)
    private String userId;

    /**
     * 用户姓名
     *
     * <p>拥有权限的用户姓名。</p>
     */
    @Column(name = "user_name", length = 100)
    private String userName;

    /**
     * 角色ID
     *
     * <p>权限关联的角色ID，为空表示用户权限。</p>
     */
    @Column(name = "role_id", length = 50)
    private String roleId;

    /**
     * 角色名称
     *
     * <p>权限关联的角色名称。</p>
     */
    @Column(name = "role_name", length = 100)
    private String roleName;

    /**
     * 权限类型
     *
     * <p>权限的类型标识。
     * 支持的类型：AUDIT_TASK（审核任务）、AUDIT_APPROVE（审核通过）、AUDIT_REJECT（审核拒绝）、AUDIT_ASSIGN（任务分配）、AUDIT_VIEW（查看权限）、AUDIT_EXPORT（导出权限）、AUDIT_MANAGE（管理权限）、AUDIT_CONFIG（配置权限）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "permission_type", nullable = false, length = 30)
    private AuditPermissionType permissionType;

    /**
     * 权限名称
     *
     * <p>权限的描述性名称。</p>
     */
    @Column(name = "permission_name", nullable = false, length = 100)
    private String permissionName;

    /**
     * 权限描述
     *
     * <p>权限的详细描述。</p>
     */
    @Column(name = "permission_description", length = 500)
    private String permissionDescription;

    /**
     * 权限范围
     *
     * <p>权限的作用范围。
     * 支持的范围：GLOBAL（全局）、DEPARTMENT（学院）、MAJOR（专业）、CLASS（班级）、COURSE（课程）、SELF（个人）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "scope", nullable = false, length = 20)
    private PermissionScope scope = PermissionScope.SELF;

    /**
     * 范围值
     *
     * <p>权限范围的具体值（如学院ID、专业ID等）。</p>
     */
    @Column(name = "scope_value", length = 200)
    private String scopeValue;

    /**
     * 授权人ID
     *
     * <p>授权权限的管理员ID。</p>
     */
    @Column(name = "granter_id", nullable = false, length = 50)
    private String granterId;

    /**
     * 授权人姓名
     *
     * <p>授权权限的管理员姓名。</p>
     */
    @Column(name = "granter_name", nullable = false, length = 100)
    private String granterName;

    /**
     * 授权时间
     *
     * <p>权限授予的时间。</p>
     */
    @Column(name = "grant_time", nullable = false)
    private LocalDateTime grantTime;

    /**
     * 生效时间
     *
     * <p>权限生效的开始时间。</p>
     */
    @Column(name = "effective_time")
    private LocalDateTime effectiveTime;

    /**
     * 过期时间
     *
     * <p>权限的过期时间，为空表示永不过期。</p>
     */
    @Column(name = "expire_time")
    private LocalDateTime expireTime;

    /**
     * 是否启用
     *
     * <p>权限是否处于启用状态。</p>
     */
    @Column(name = "is_enabled", nullable = false)
    private Boolean isEnabled = true;

    /**
     * 是否临时权限
     *
     * <p>是否为临时授予的权限。</p>
     */
    @Column(name = "is_temporary", nullable = false)
    private Boolean isTemporary = false;

    /**
     * 权限级别
     *
     * <p>权限的级别。
     * 支持的级别：READ（只读）、WRITE（读写）、ADMIN（管理）、SUPER（超级）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "permission_level", nullable = false, length = 10)
    private AuditPermissionLevel permissionLevel = AuditPermissionLevel.READ;

    /**
     * 权限条件
     *
     * <p>权限的生效条件，JSON格式存储。</p>
     */
    @Column(name = "permission_conditions", columnDefinition = "TEXT")
    private String permissionConditions;

    /**
     * 权限限制
     *
     * <p>权限的使用限制，JSON格式存储。</p>
     */
    @Column(name = "permission_restrictions", columnDefinition = "TEXT")
    private String permissionRestrictions;

    /**
     * 使用次数限制
     *
     * <p>权限的使用次数限制。</p>
     */
    @Column(name = "usage_limit")
    private Integer usageLimit;

    /**
     * 已使用次数
     *
     * <p>权限已使用的次数。</p>
     */
    @Column(name = "used_count", nullable = false)
    private Integer usedCount = 0;

    /**
     * 最后使用时间
     *
     * <p>权限最后被使用的时间。</p>
     */
    @Column(name = "last_used_time")
    private LocalDateTime lastUsedTime;

    /**
     * 权限标签
     *
     * <p>JSON格式的权限标签，用于分类和过滤。</p>
     */
    @Column(name = "permission_tags", columnDefinition = "TEXT")
    private String permissionTags;

    /**
     * 权限备注
     *
     * <p>权限的备注信息。</p>
     */
    @Column(name = "permission_notes", columnDefinition = "TEXT")
    private String permissionNotes;

    /**
     * 撤销原因
     *
     * <p>权限被撤销的原因。</p>
     */
    @Column(name = "revoke_reason", length = 500)
    private String revokeReason;

    /**
     * 撤销人ID
     *
     * <p>撤销权限的管理员ID。</p>
     */
    @Column(name = "revoker_id", length = 50)
    private String revokerId;

    /**
     * 撤销人姓名
     *
     * <p>撤销权限的管理员姓名。</p>
     */
    @Column(name = "revoker_name", length = 100)
    private String revokerName;

    /**
     * 撤销时间
     *
     * <p>权限被撤销的时间。</p>
     */
    @Column(name = "revoke_time")
    private LocalDateTime revokeTime;

    /**
     * 审批状态
     *
     * <p>权限的审批状态。
     * 支持的状态：PENDING（待审批）、APPROVED（已审批）、REJECTED（已拒绝）、EXPIRED（已过期）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "approval_status", length = 20)
    private AuditApprovalStatus approvalStatus = AuditApprovalStatus.APPROVED;

    /**
     * 审批人ID
     *
     * <p>审批权限的管理员ID。</p>
     */
    @Column(name = "approver_id", length = 50)
    private String approverId;

    /**
     * 审批人姓名
     *
     * <p>审批权限的管理员姓名。</p>
     */
    @Column(name = "approver_name", length = 100)
    private String approverName;

    /**
     * 审批时间
     *
     * <p>权限审批的时间。</p>
     */
    @Column(name = "approval_time")
    private LocalDateTime approvalTime;

    /**
     * 审批意见
     *
     * <p>审批时的意见说明。</p>
     */
    @Column(name = "approval_comment", length = 500)
    private String approvalComment;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 删除用户ID
     */
    @Column(name = "delete_user_id", length = 50)
    private String deleteUserId;

    // ===== 枚举定义 =====

    

}
